from datetime import datetime

from database import db_session

from flask import session

from sqlalchemy import exc
from sqlalchemy import or_

from sqlalchemy.sql.expression import func

from models import *

def items_reporte_solicitud(id_usuario, nombre_proyecto):
    """Lista las solicitudes del proyecto
    @param id_usuario: Id del usuario actual
    @param nombre_proyecto: Nombre del proyecto actual"""
    lista=[]

    proyecto = db_session.query(Proyecto).filter_by\
    (nombre=nombre_proyecto).one()

    lider = db_session.query(Usuario).filter_by\
    (id=proyecto.lider).one()

    solicitudes = db_session.query(Solicitud).filter_by\
    (fk_proyecto=proyecto.id).all()

    for solicitud in solicitudes:
        usuario = db_session.query(Usuario).filter_by\
        (id=solicitud.usuario_creacion).one()

        fecha = solicitud.fecha_creacion
        year = fecha.year
        month = fecha.month
        day = fecha.day
        fechaDMA = str(day) + "/" + str(month) + "/" + str(year)

        voto = db_session.query(Voto).filter_by\
        (fk_solicitud=solicitud.id, fk_usuario=lider.id).first()
        voto_lider = None
        if voto != None:
            voto_lider = 'S'
        else:
            voto_lider = 'N'

        elem = dict(id=solicitud.id, descripcion=solicitud.descripcion, \
        impacto=solicitud.impacto, estado=solicitud.estado, votos=\
        solicitud.votos_a_favor, fecha=fechaDMA, \
        solicitante=usuario.id_usuario, voto_lider=voto_lider)

        lista.append(elem)

    lista = sorted(lista, key=lambda elemento: elemento['id'])
    return lista

def items_reporte_proyecto(id_usuario, nombre_proyecto):
    """Lista los items del proyecto
    @param id_usuario: Id del usuario actual
    @param nombre_proyecto: Nombre del proyecto actual"""
    lista=[]

    proyecto = db_session.query(Proyecto).filter_by\
    (nombre=nombre_proyecto).one()

    lista_fases = proyecto.fases

    for fase in lista_fases:
        lista_tipos = db_session.query(TipoItem).filter_by\
        (fk_fase=fase.id).all()

        for tipo in lista_tipos:
            lista_items = db_session.query(Item).filter_by\
            (fk_tipo_item=tipo.id).all()

            for item in lista_items:
                if item.estado != 'ELI' and item.estado != 'INA':
                    elem = dict(id=item.id, id_fase=fase.id, \
                    nombre=item.nombre, descripcion=item.descripcion, \
                    estado=item.estado, version=item.version, \
                    complejidad=item.complejidad, costo=item.costo, \
                    tipo=tipo.nombre)

                    lista.append(elem)

    return lista

def fases_proyecto(nombre_proyecto):
    """Retorna la lista de fases del proyecto actual
    @param nombre_proyecto: Nombre del proyecto actual"""
    lista=[]

    proyecto = db_session.query(Proyecto).filter_by\
    (nombre=nombre_proyecto).one()

    for fase in proyecto.fases:
        elem = dict(id=fase.id, nombre=fase.nombre, orden=fase.orden)
        lista.append(elem)

    lista = sorted(lista, key=lambda elemento: elemento['orden'])
    return lista

def reporte_historial_item_lista(id_item):
    """Lista el historial del item seleccionado
    @param id_item: Id del item actual"""
    lista=[]

    item = db_session.query(Item).filter_by\
    (id=id_item).one()

    tipo = db_session.query(TipoItem).filter_by\
    (id=item.fk_tipo_item).one()

    item_anterior = 0
    while item_anterior != None:
        elem = dict(id=item.id, nombre=item.nombre, descripcion=\
        item.descripcion, observacion=item.observacion, version=\
        item.version, complejidad=item.complejidad, costo=\
        item.costo, id_tipo=item.fk_tipo_item, nombre_tipo=\
        tipo.nombre)

        lista.append(elem)

        item_anterior = item.item_anterior

        if item_anterior != None:
            item = db_session.query(Item).filter_by\
            (id=item_anterior).one()

    lista = sorted(lista, key=lambda elemento: elemento['version'])
    return lista

def reporte_historial_valores(id_item, historial_item):
    """Lista el historial de las distintas versiones del item 
    seleccionado
    @param id_item: Id del item actual
    @param historial_item: Las versiones del item seleccionado"""
    lista=[]

    for item in historial_item:
        id_item = int(item['id'])
        id_tipo = int(item['id_tipo'])

        atributos = db_session.query(Atributo).filter_by\
        (fk_tipo_item=id_tipo).all()

        for atributo in atributos:
            if atributo.tipo != 4:
                valor = db_session.query(Valor).filter_by\
                (fk_item=id_item, fk_atributo=atributo.id).one()

                contenido = None

                if atributo.tipo == 1 and valor.valor_numerico != None:
                    contenido = valor.valor_numerico

                if atributo.tipo == 2 and valor.valor_cadena != None:
                    contenido = valor.valor_cadena

                if atributo.tipo == 3 and valor.valor_fecha != None:
                    fecha = valor.valor_fecha
                    year = fecha.year
                    month = fecha.month
                    day = fecha.day
                    contenido = str(day) + "/" + str(month) + "/" + str(year)

                elem = dict(id_item=id_item, nombre_atributo=\
                atributo.nombre, valor=contenido)
                lista.append(elem)

    return lista

def fecha_actual_str():
    """Retorna la fecha actual en formato String"""
    fecha = datetime.now()

    fecha_str = ""
    fecha_str = fecha_str + str(fecha.day)
    fecha_str = fecha_str + "/" + str(fecha.month)
    fecha_str = fecha_str + "/" + str(fecha.year)
    fecha_str = fecha_str + " " + str(fecha.hour)
    fecha_str = fecha_str + ":" + str(fecha.minute)
    fecha_str = fecha_str + ":" + str(fecha.second)

    return fecha_str
